`include "timescale.v"

// module ahb_master(
// 	input 		   hresetn,
// 	input 		   hclk,
	
// 	output [31:0]  haddr,
// 	output [1:0]   htrans,
// 	output 		   hwrite,
// 	output [2:0]   hsize,
// 	output [2:0]   hburst,
// 	output [3:0]   hprot,
// 	output [31:0]  hwdata

// 	input  [31:0]  hrdata,
// 	// output 		   hsel,
// 	);

// reg 			  start;


module test();

	reg 		   hresetn;
	reg 		   hclk;
	
	reg [31:0]  haddr;
	reg [1:0]   htrans;
	reg 		   hwrite;
	reg [2:0]   hsize;
	reg [2:0]   hburst;
	reg [3:0]   hprot;
	reg    [31:0]  hwdata;

	reg 		   hsel;

wire	  [1:0]   hresp;
wire  	  [31:0]  hrdata;

ram_top U_ram(
		.hclk(hclk)                ,
		.hresetn(hresetn)             ,
		.hsel_s(hsel)              ,
		.haddr_s(haddr[19:0])             ,
		.hburst_s(hburst)            ,
		.htrans_s(htrans)            ,
		.hrdata_s(hrdata)            ,
		.hwdata_s(hwdata)            ,
		.hwrite_s(hwrite)            ,
		.hready_s(hready)            ,
		.hresp_s			(hresp)
		);


initial begin
  hresetn = 0;
  #10 hresetn = 1;
end

initial begin
  hclk = 0;
  forever #5 hclk = ~hclk;
end

initial begin
  hsel = 0;

  #20;
  @(posedge hclk);
  hsel = 1;
  hburst = 3'b000;
  htrans = 2'b10;
  hwrite = 1;
  haddr = 32'h0000_0010;
  hwdata = 32'h1234_5678;

  @(posedge hclk);
  haddr = 32'h0000_0011;
  hwdata = 32'h1234_5679;

  @(posedge hclk);
  haddr = 32'h0000_0012;
  hwdata = 32'h1234_567a;

  @(posedge hclk);
  haddr = 32'h0000_0013;
  hwdata = 32'h1234_567b;

  @(posedge hclk);
  haddr = 32'h0000_0014;
  hwdata = 32'h1234_567c;
  
end

endmodule // ahb_master


// always@(posedge hclk or negedge hresetn)
// begin
//   if(!hresetn) begin
// 	// ...
// 	end
//   else begin
	
// 	if(start) begin
// 	  haddr <= ;

// 	  // hwdata <= ;
// 	  hready <= ;
// 	  hrdata <= ;
// 	end

	
//   end
	
	
// end



// wire 	  [31:0]  BASE_ADDR;
// assign 			  BASE_ADDR   = 32'h8001_0000;

// // reg 	  [31:0]  rx_bd, tx_bd;
// // reg 	  [31:0]  rx_bd, tx_bd;
// reg 	  [31:0]  DMA_CTRL[0:7];				//8 words memory
// // 0 : tx_bd
// // 1 : rx_bd


// //fsm of the write operation
// localparam [1:0]  IDLE 		  = 2'b00,
// 				  SETUP = 2'b01,
// 				  ENABLE = 2'b11;

// reg 	  [1:0]   currentState, nextState;
// always@(*)
// begin
//   nextState = IDLE;
//   case(currentState)
// 	  IDLE: begin
// 		if(psel & ~penable)
// 		  nextState = SETUP;
// 	  end
// 	  SETUP: begin
// 		if(psel & penable)
// 		  nextState = ENABLE;	//the next clk must go into this state
// 	  end
// 	  ENABLE: begin
// 		if(psel & ~penable)
// 		  nextState = SETUP;
// 	  end
//   endcase
// end


// reg 	  [31:0]  waddr;
// integer 		  i;
// always@(posedge pclk or negedge presetn)
// begin
//   if(!presetn) begin
// 	currentState <= IDLE;
// 	for(i=0;i<8;i=i+1)
// 	  DMA_CTRL[i] <= 32'd0;
//   end
//   else begin
// 	currentState <= nextState;
// 	case(nextState)
// 		SETUP: begin
// 		  $display("paddr = %x", paddr);
// 		  waddr <= paddr;
// 		end
// 		ENABLE:
// 		  DMA_CTRL[waddr-BASE_ADDR] <= pwdata;
// 	endcase
//   end
// end

// endmodule // apb


// // always@(posedge pclk or negedge presetn)
// // begin
// //   if(!presetn) begin
// // 	rx_bd <= 32'h0000_0000;				//the init value ??
// // 	tx_bd <= 32'h0000_0000;
// //   end
// //   else 
// // 	case(currentState)
// // 		end
// // end

